はじめに

  • おぼえたことをがんばってめもするイッヌ
  • Windows環境を想定した内容です

設定

R

インストール

  1. CRAN(The Comprehensive R Archive Network)をクリック(The Institute of Statistical Mathematics, Tokyo)

  2. Download R for Windowsをクリック Figure1.Rのインストール方法1

  3. baseをクリック

Figure2.Rのインストール方法2

  1. Download R-X.X.X for Windowsをクリック

Figure3.Rのインストール方法3

  1. ダウンロードしたファイル(R-X.X.X-win)をダブルクリックし,次へをクリックしていく(特別な事情がなければデフォルトの設定のままでよい)

バージョンアップ/ダウン

  1. 「インストール」と同様の手順でインストール

  2. ToolsをクリックしてGlobal Optionsをクリック

Figure4.Rのバージョンアップ/ダウン方法1

  1. Changeをクリック

Figure5.Rのバージョンアップ/ダウン方法2

  1. 最新のバージョンを選択してOKをクリックしてさらにOKをクリック

バージョンダウンさせたければ,ここで古いバージョンを選択する

Figure6.Rのバージョンアップ/ダウン方法3

  1. コンソールでR.versionと打ち,バージョンを確認

Figure7.Rのバージョンアップ/ダウン方法4

  1. 反映されていなければ,一度RStudioを起動し直す

RStudio

インストール

  • Rをインストールしてから
  1. Download the RStudio IDEをクリック

Figure8.RStudioのインストール方法1

  1. スクロールしてAll Installersから”Windows X”の”RStudio-XXXX.XX.x-XXX.exe”をクリック

Figure9.RStudioのインストール方法2

  1. ダウンロードされたファイルをダブルクリックし,次へをクリックしていく(特別な事情がなければデフォルトの設定のままでよい)

ワークスペースの設定

  1. ToolsをクリックしてGlobal optionsをクリック

Figure10.RStudioの設定1

  1. Workspaceの”Restore .RData into workspace at startup”にチェックが入っていたらチェックを外す

Figure11.RStudioの設定2

  1. 同じWorkspaceの”Save workspace to .RData on exit”が”Never”になっていなければ”Never”にしてOKをクリック

Figure12.RStudioの設定3

文字コードの設定

  1. ToolsをクリックしてGlobal optionsをクリック

Figure13.RStudioの設定4

  1. CodeをクリックしてSavingをクリックしてDefault text encodingで”UTF-8”を選択してOKをクリック

Figure14.RStudioの設定5

プロジェクトの使い方

  • GitHubと連携する場合は,GitHub-tipsの”RStudioの設定”にプロジェクトの設定方法を記載しているので,そちらをご参照ください。
  1. ProjectをクリックしてNew Projectをクリック

Figure15.RStudioプロジェクトの設定1

  1. New Directoryをクリック

Figure16.RStudioプロジェクトの設定2

  1. New Projectをクリック

Figure17.RStudioプロジェクトの設定3

  1. Directory nameにプロジェクト名を入力

Figure18.RStudioプロジェクトの設定4

  1. Create project as subdirectory ofにプロジェクトを作りたい場所を指定してCreate Projectをクリック

Figure19.RStudioプロジェクトの設定5

パッケージの読み込み

  • 起動するたびにパッケージを読み込む必要がある

  • パッケージをインストールしていなければinstall.packages("tidyverse")でインストール

パッケージを読み込み

library(tidyverse)
library(palmerpenguins) # サンプルデータ

データの読み込み(Import)

csvファイルを読み込む場合

  • data.tableパッケージのfread関数
    • freadはRの文字コードに依存する
    • いまはRの文字コードがUTF-8になったので,UTF-8で作られたcsvであれば読み込める
    • cp932で作られたcsvは読み込めない
    • tibble型にはならない
    • data.table: Extension of ‘data.frame’
  • vroomパッケージのvroom関数(推奨)
    • vroomは文字コードを指定することができる
    • UTF-8がデフォルトのため,UTF-8で作られたcsvであれば引数なしに読み込める
    • cp932で作られたcsvは引数locale = locale(encoding = "cp932")を指定すれば読み込める
    • tibble型になる
    • vroom: Read and Write Rectangular Text Data Quickly
# fread(UTF-8)
# tibble型になっていないのでas_tibble()でtibble型にする
df <- 
  data.table::fread(".csv",
                    data.table = FALSE) |> 
  as_tibble()

# vroom(UTF-8)
df <- 
  vroom::vroom(".csv")

# vroom(cp932)
df <- 
  vroom::vroom(".csv",
               locale = locale(encoding = "cp932"))

Excelファイルを読み込む場合

  • readxlパッケージのread_xlsx関数
df <- 
  readxl::read_xlsx(".xlsx") |> 
  as_tibble()

# シートを指定したいときはsheet引数を使う
df <- 
  read_xlsx(".xlsx", 
            sheet = "") |> 
  as_tibble()

データ変換(Data transformation)

  • サンプルデータの内容(palmerpenguinsパッケージのpenguinsデータ)
    • 8変数344観測値のデータ
    • species: ペンギンの種を表す因子型の変数(アデリー,ヒゲ,ジェンツー)
    • island: 南極パーマー諸島の島を表す因子型の変数(ビスコー諸島,ドリーム島,トージャーセン島)
    • bill_length_mm: くちばしの長さを表す実数型の変数(mm)
    • bill_depth_mm: くちばしの厚さを表す実数型の変数(mm)
    • flipper_length_mm: 翼の長さを表す整数型の変数(mm)
    • body_mass_g: 体重を表す整数型の変数(グラム)
    • sex: 性別を表す因子型の変数(オス,メス)
    • year: 調査年を表す整数型の変数(2007年,2008年,2009年)
    • palmerpenguins: Palmer Archipelago (Antarctica) Penguin Data
penguins
## # A tibble: 344 × 8
##    species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##    <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
##  1 Adelie  Torgersen           39.1          18.7               181        3750
##  2 Adelie  Torgersen           39.5          17.4               186        3800
##  3 Adelie  Torgersen           40.3          18                 195        3250
##  4 Adelie  Torgersen           NA            NA                  NA          NA
##  5 Adelie  Torgersen           36.7          19.3               193        3450
##  6 Adelie  Torgersen           39.3          20.6               190        3650
##  7 Adelie  Torgersen           38.9          17.8               181        3625
##  8 Adelie  Torgersen           39.2          19.6               195        4675
##  9 Adelie  Torgersen           34.1          18.1               193        3475
## 10 Adelie  Torgersen           42            20.2               190        4250
## # … with 334 more rows, and 2 more variables: sex <fct>, year <int>

ケースを選択する(filter)

条件をひとつ指定

選択
  • ==(等しい),>=(以上),>(超),<=(以下),<(未満)などが使える
# "species"が"Adelie"のケースを選択する
# count()で"species"を確認
penguins |> 
  filter(species == "Adelie") |> 
  count(species)
## # A tibble: 1 × 2
##   species     n
##   <fct>   <int>
## 1 Adelie    152
# "bill_length_mm"が"35以上"のケースを選択する
# count()で"bill_length_mm"を確認
penguins |> 
  filter(bill_length_mm >= 35) |> 
  count(bill_length_mm)
## # A tibble: 156 × 2
##    bill_length_mm     n
##             <dbl> <int>
##  1           35       2
##  2           35.1     1
##  3           35.2     1
##  4           35.3     1
##  5           35.5     2
##  6           35.6     1
##  7           35.7     3
##  8           35.9     2
##  9           36       4
## 10           36.2     3
## # … with 146 more rows
# "bill_length_mm"が"35超"のケースを選択する
# count()で"bill_length_mm"を確認
penguins |> 
  filter(bill_length_mm > 35) |> 
  count(bill_length_mm)
## # A tibble: 155 × 2
##    bill_length_mm     n
##             <dbl> <int>
##  1           35.1     1
##  2           35.2     1
##  3           35.3     1
##  4           35.5     2
##  5           35.6     1
##  6           35.7     3
##  7           35.9     2
##  8           36       4
##  9           36.2     3
## 10           36.3     1
## # … with 145 more rows
# "bill_depth_mm"が"14以下"のケースを選択する
# count()で"bill_depth_mm"を確認
penguins |> 
  filter(bill_depth_mm <= 14) |> 
  count(bill_depth_mm)
## # A tibble: 10 × 2
##    bill_depth_mm     n
##            <dbl> <int>
##  1          13.1     1
##  2          13.2     1
##  3          13.3     1
##  4          13.4     1
##  5          13.5     2
##  6          13.6     1
##  7          13.7     6
##  8          13.8     4
##  9          13.9     4
## 10          14       2
# "bill_depth_mm"が"35超"のケースを選択する
# count()で"bill_depth_mm"を確認
penguins |> 
  filter(bill_depth_mm < 14) |> 
  count(bill_depth_mm)
## # A tibble: 9 × 2
##   bill_depth_mm     n
##           <dbl> <int>
## 1          13.1     1
## 2          13.2     1
## 3          13.3     1
## 4          13.4     1
## 5          13.5     2
## 6          13.6     1
## 7          13.7     6
## 8          13.8     4
## 9          13.9     4
選択しない
  • ==(等しい),>=(以上),>(超),<=(以下),<(未満)などが使える

  • !=でfilterするとNAも削除されることに注意(詳細は後述)

# "species"が"Adelie"のケースを選択しない
# count()で"species"を確認
penguins |> 
  filter(species != "Adelie") |> 
  count(species)
## # A tibble: 2 × 2
##   species       n
##   <fct>     <int>
## 1 Chinstrap    68
## 2 Gentoo      124
# "bill_length_mm"が"35以上"のケースを選択しない
# count()で"bill_length_mm"を確認
penguins |> 
  filter(!(bill_length_mm >= 35)) |> 
  count(bill_length_mm)
## # A tibble: 8 × 2
##   bill_length_mm     n
##            <dbl> <int>
## 1           32.1     1
## 2           33.1     1
## 3           33.5     1
## 4           34       1
## 5           34.1     1
## 6           34.4     1
## 7           34.5     1
## 8           34.6     2
# "bill_length_mm"が"35超"のケースを選択しない
# count()で"bill_length_mm"を確認
penguins |> 
  filter(!(bill_length_mm > 35)) |> 
  count(bill_length_mm)
## # A tibble: 9 × 2
##   bill_length_mm     n
##            <dbl> <int>
## 1           32.1     1
## 2           33.1     1
## 3           33.5     1
## 4           34       1
## 5           34.1     1
## 6           34.4     1
## 7           34.5     1
## 8           34.6     2
## 9           35       2
# "bill_depth_mm"が"14以下"のケースを選択しない
# count()で"bill_depth_mm"を確認
penguins |> 
  filter(!(bill_depth_mm <= 14)) |> 
  count(bill_depth_mm)
## # A tibble: 70 × 2
##    bill_depth_mm     n
##            <dbl> <int>
##  1          14.1     3
##  2          14.2     6
##  3          14.3     4
##  4          14.4     5
##  5          14.5     8
##  6          14.6     5
##  7          14.7     2
##  8          14.8     3
##  9          14.9     1
## 10          15      10
## # … with 60 more rows
# "bill_depth_mm"が"35超"のケースを選択しない
# count()で"bill_depth_mm"を確認
penguins |> 
  filter(!(bill_depth_mm < 14)) |> 
  count(bill_depth_mm)
## # A tibble: 71 × 2
##    bill_depth_mm     n
##            <dbl> <int>
##  1          14       2
##  2          14.1     3
##  3          14.2     6
##  4          14.3     4
##  5          14.4     5
##  6          14.5     8
##  7          14.6     5
##  8          14.7     2
##  9          14.8     3
## 10          14.9     1
## # … with 61 more rows

条件を複数指定

選択
  • &(および),|(または)などが使える

  • |のショートカットに%in%がある

# "species"が"Adelie"で"island"が"Biscoe"のケースを選択する
# count()で"species"と"island"を確認
penguins |> 
  filter(species == "Adelie" & island == "Biscoe") |> 
  count(species, island)
## # A tibble: 1 × 3
##   species island     n
##   <fct>   <fct>  <int>
## 1 Adelie  Biscoe    44
# "species"が"Adelie"または"Chinstrap"のケースを選択する
# count()で"species"を確認

# | 
penguins |> 
  filter(species == "Adelie" | species == "Chinstrap") |> 
  count(species)
## # A tibble: 2 × 2
##   species       n
##   <fct>     <int>
## 1 Adelie      152
## 2 Chinstrap    68
# %in% 
penguins |> 
  filter(species %in% c("Adelie", "Chinstrap")) |> 
  count(species)
## # A tibble: 2 × 2
##   species       n
##   <fct>     <int>
## 1 Adelie      152
## 2 Chinstrap    68
選択しない
  • &(および),|(または)などが使える

  • |のショートカットに%in%がある

# "species"が"Adelie"で"island"が"Biscoe"のケースを選択しない
# count()で"species"と"island"を確認
penguins |> 
  filter(!(species == "Adelie" & island == "Biscoe")) |> 
  count(species, island)
## # A tibble: 4 × 3
##   species   island        n
##   <fct>     <fct>     <int>
## 1 Adelie    Dream        56
## 2 Adelie    Torgersen    52
## 3 Chinstrap Dream        68
## 4 Gentoo    Biscoe      124
# "species"が"Adelie"または"Chinstrap"のケースを選択しない
# count()で"species"を確認

# | 
penguins |> 
  filter(!(species == "Adelie" | species == "Chinstrap")) |> 
  count(species)
## # A tibble: 1 × 2
##   species     n
##   <fct>   <int>
## 1 Gentoo    124
# %in% 
penguins |> 
  filter(!species %in% c("Adelie", "Chinstrap")) |> 
  count(species)
## # A tibble: 1 × 2
##   species     n
##   <fct>   <int>
## 1 Gentoo    124

水準の条件を指定

選択する
# "fruit"の変数を追加したオブジェクトを作成
df <- 
  tribble(
    ~fruit, 
      "apple",
      "banana",
      "melon",
      "strawberry",
      "orange",
      "peach",
      "green apple")

df
## # A tibble: 7 × 1
##   fruit      
##   <chr>      
## 1 apple      
## 2 banana     
## 3 melon      
## 4 strawberry 
## 5 orange     
## 6 peach      
## 7 green apple
# "fruit"の中で"apple"という文字を含むケースを選択する
df |> 
  filter(str_detect(fruit, "apple"))
## # A tibble: 2 × 1
##   fruit      
##   <chr>      
## 1 apple      
## 2 green apple
# "fruit"の中で"apple"という文字を含むケースを選択しない
df |> 
  filter(!str_detect(fruit, "apple"))
## # A tibble: 5 × 1
##   fruit     
##   <chr>     
## 1 banana    
## 2 melon     
## 3 strawberry
## 4 orange    
## 5 peach
選択しない
# "fruit"の中で"apple"という文字を含むケースを選択しない
df |> 
  filter(!str_detect(fruit, "apple"))
## # A tibble: 5 × 1
##   fruit     
##   <chr>     
## 1 banana    
## 2 melon     
## 3 strawberry
## 4 orange    
## 5 peach

!= を使うときの注意

  • filter(sex != "male")"でfilterするとNAも削除される

  • filter(!sex %in% c("male"))"でfilterすればNAは削除されない

# "sex"には"female","male","NA"が入っている
penguins |> 
  count(sex)
## # A tibble: 3 × 2
##   sex        n
##   <fct>  <int>
## 1 female   165
## 2 male     168
## 3 <NA>      11
# "sex != male"として"male"を選択しないようにする
# count()で"sex"を確認
# "NA"も除外されていて"female"のみが選択される
penguins |> 
  filter(sex != "male") |> 
  count(sex)
## # A tibble: 1 × 2
##   sex        n
##   <fct>  <int>
## 1 female   165
# "NA"を除外せず"male"だけを選択しないようにする
# count()で"sex"を確認
# "female"と"NA"が選択される
penguins |> 
  filter(!sex %in% c("male")) |> 
  count(sex)
## # A tibble: 2 × 2
##   sex        n
##   <fct>  <int>
## 1 female   165
## 2 <NA>      11

欠損値

選択する
# "sexがNAのケースを選択する
# count()で"sex"を確認
penguins |>
  filter(is.na(sex)) |> 
  count(sex)
## # A tibble: 1 × 2
##   sex       n
##   <fct> <int>
## 1 <NA>     11
選択しない
  • drop_nafilter(!is.na)を使う方法がある

  • ひとつの変数を扱う場合であればどちらも同じだが,複数の変数を扱う場合はdrop_naのほうが便利そう

# drop_na ----------

## "sexがNAのケースを選択しない
## count()で"sex"を確認
penguins |> 
  drop_na(sex) |> 
  count(sex)
## # A tibble: 2 × 2
##   sex        n
##   <fct>  <int>
## 1 female   165
## 2 male     168
## 複数の変数の欠損を除く
## filter(is.na)で"sex"の欠損または"bill_length_mm"の欠損を確認
penguins |> 
  drop_na(sex, bill_length_mm) |> 
  filter(is.na(sex) | is.na(bill_length_mm))
## # A tibble: 0 × 8
## # … with 8 variables: species <fct>, island <fct>, bill_length_mm <dbl>,
## #   bill_depth_mm <dbl>, flipper_length_mm <int>, body_mass_g <int>, sex <fct>,
## #   year <int>
# filter(!is.na) ----------

## "sexがNAのケースを選択しない
## count()で"sex"を確認
penguins |>
  filter(!is.na(sex)) |> 
  count(sex)
## # A tibble: 2 × 2
##   sex        n
##   <fct>  <int>
## 1 female   165
## 2 male     168
## 複数の変数の欠損を除く
## filter(is.na)で"sex"の欠損または"bill_length_mm"の欠損を確認
penguins |>
  filter(!is.na(sex), !is.na(bill_length_mm)) |> 
  filter(is.na(sex) | is.na(bill_length_mm))
## # A tibble: 0 × 8
## # … with 8 variables: species <fct>, island <fct>, bill_length_mm <dbl>,
## #   bill_depth_mm <dbl>, flipper_length_mm <int>, body_mass_g <int>, sex <fct>,
## #   year <int>

ケースを並び替える(arrange)

昇順

# "bill_length_mm"を昇順に並び替える
# select()で"bill_length_mm"を確認
penguins |> 
  arrange(bill_length_mm) |> 
  select(bill_length_mm)
## # A tibble: 344 × 1
##    bill_length_mm
##             <dbl>
##  1           32.1
##  2           33.1
##  3           33.5
##  4           34  
##  5           34.1
##  6           34.4
##  7           34.5
##  8           34.6
##  9           34.6
## 10           35  
## # … with 334 more rows

降順

# "bill_length_mm"を降順に並び替える
# select()で"bill_length_mm"を確認
penguins |> 
  arrange(desc(bill_length_mm)) |> 
  select(bill_length_mm)
## # A tibble: 344 × 1
##    bill_length_mm
##             <dbl>
##  1           59.6
##  2           58  
##  3           55.9
##  4           55.8
##  5           55.1
##  6           54.3
##  7           54.2
##  8           53.5
##  9           53.4
## 10           52.8
## # … with 334 more rows

変数を選択する(select)

  • matches()を用いた正規表現の詳細は別の章

変数をひとつ指定

選択
# "species"を選択する
penguins |> 
  select(species)
## # A tibble: 344 × 1
##    species
##    <fct>  
##  1 Adelie 
##  2 Adelie 
##  3 Adelie 
##  4 Adelie 
##  5 Adelie 
##  6 Adelie 
##  7 Adelie 
##  8 Adelie 
##  9 Adelie 
## 10 Adelie 
## # … with 334 more rows
選択しない
# "species"を選択しない
penguins |> 
  select(!species)
## # A tibble: 344 × 7
##    island  bill_length_mm bill_depth_mm flipper_length_… body_mass_g sex    year
##    <fct>            <dbl>         <dbl>            <int>       <int> <fct> <int>
##  1 Torger…           39.1          18.7              181        3750 male   2007
##  2 Torger…           39.5          17.4              186        3800 fema…  2007
##  3 Torger…           40.3          18                195        3250 fema…  2007
##  4 Torger…           NA            NA                 NA          NA <NA>   2007
##  5 Torger…           36.7          19.3              193        3450 fema…  2007
##  6 Torger…           39.3          20.6              190        3650 male   2007
##  7 Torger…           38.9          17.8              181        3625 fema…  2007
##  8 Torger…           39.2          19.6              195        4675 male   2007
##  9 Torger…           34.1          18.1              193        3475 <NA>   2007
## 10 Torger…           42            20.2              190        4250 <NA>   2007
## # … with 334 more rows

変数を個別に複数指定

選択する
# "species","island","year"を選択する
penguins |> 
  select(species, island, year)
## # A tibble: 344 × 3
##    species island     year
##    <fct>   <fct>     <int>
##  1 Adelie  Torgersen  2007
##  2 Adelie  Torgersen  2007
##  3 Adelie  Torgersen  2007
##  4 Adelie  Torgersen  2007
##  5 Adelie  Torgersen  2007
##  6 Adelie  Torgersen  2007
##  7 Adelie  Torgersen  2007
##  8 Adelie  Torgersen  2007
##  9 Adelie  Torgersen  2007
## 10 Adelie  Torgersen  2007
## # … with 334 more rows
選択しない
# "species","island","year"を選択しない
penguins |> 
  select(!c(species, island, year))
## # A tibble: 344 × 5
##    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex   
##             <dbl>         <dbl>             <int>       <int> <fct> 
##  1           39.1          18.7               181        3750 male  
##  2           39.5          17.4               186        3800 female
##  3           40.3          18                 195        3250 female
##  4           NA            NA                  NA          NA <NA>  
##  5           36.7          19.3               193        3450 female
##  6           39.3          20.6               190        3650 male  
##  7           38.9          17.8               181        3625 female
##  8           39.2          19.6               195        4675 male  
##  9           34.1          18.1               193        3475 <NA>  
## 10           42            20.2               190        4250 <NA>  
## # … with 334 more rows

変数を連続で複数指定

選択する
# "species"から"bill_length_mm"を選択する
penguins |> 
  select(species:bill_length_mm)
## # A tibble: 344 × 3
##    species island    bill_length_mm
##    <fct>   <fct>              <dbl>
##  1 Adelie  Torgersen           39.1
##  2 Adelie  Torgersen           39.5
##  3 Adelie  Torgersen           40.3
##  4 Adelie  Torgersen           NA  
##  5 Adelie  Torgersen           36.7
##  6 Adelie  Torgersen           39.3
##  7 Adelie  Torgersen           38.9
##  8 Adelie  Torgersen           39.2
##  9 Adelie  Torgersen           34.1
## 10 Adelie  Torgersen           42  
## # … with 334 more rows
選択しない
# "species"から"bill_length_mm"を選択しない
penguins |> 
  select(!species:bill_length_mm)
## # A tibble: 344 × 5
##    bill_depth_mm flipper_length_mm body_mass_g sex     year
##            <dbl>             <int>       <int> <fct>  <int>
##  1          18.7               181        3750 male    2007
##  2          17.4               186        3800 female  2007
##  3          18                 195        3250 female  2007
##  4          NA                  NA          NA <NA>    2007
##  5          19.3               193        3450 female  2007
##  6          20.6               190        3650 male    2007
##  7          17.8               181        3625 female  2007
##  8          19.6               195        4675 male    2007
##  9          18.1               193        3475 <NA>    2007
## 10          20.2               190        4250 <NA>    2007
## # … with 334 more rows

変数をまとめて複数指定

選択する
# "species","year"をまとめて選択する

# "species","year"を含むオブジェクトを作成
obs <- 
  c("species", "year")

# all_of
penguins |> 
  select(all_of(obs))
## # A tibble: 344 × 2
##    species  year
##    <fct>   <int>
##  1 Adelie   2007
##  2 Adelie   2007
##  3 Adelie   2007
##  4 Adelie   2007
##  5 Adelie   2007
##  6 Adelie   2007
##  7 Adelie   2007
##  8 Adelie   2007
##  9 Adelie   2007
## 10 Adelie   2007
## # … with 334 more rows
# any_of
penguins |> 
  select(any_of(obs))
## # A tibble: 344 × 2
##    species  year
##    <fct>   <int>
##  1 Adelie   2007
##  2 Adelie   2007
##  3 Adelie   2007
##  4 Adelie   2007
##  5 Adelie   2007
##  6 Adelie   2007
##  7 Adelie   2007
##  8 Adelie   2007
##  9 Adelie   2007
## 10 Adelie   2007
## # … with 334 more rows
選択しない
# "species","year"をまとめて選択しない

# "species","year"を含むオブジェクトを作成
obs <- 
  c("species", "year")

# all_of
penguins |> 
  select(!all_of(obs))
## # A tibble: 344 × 6
##    island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex   
##    <fct>              <dbl>         <dbl>             <int>       <int> <fct> 
##  1 Torgersen           39.1          18.7               181        3750 male  
##  2 Torgersen           39.5          17.4               186        3800 female
##  3 Torgersen           40.3          18                 195        3250 female
##  4 Torgersen           NA            NA                  NA          NA <NA>  
##  5 Torgersen           36.7          19.3               193        3450 female
##  6 Torgersen           39.3          20.6               190        3650 male  
##  7 Torgersen           38.9          17.8               181        3625 female
##  8 Torgersen           39.2          19.6               195        4675 male  
##  9 Torgersen           34.1          18.1               193        3475 <NA>  
## 10 Torgersen           42            20.2               190        4250 <NA>  
## # … with 334 more rows
# any_of
penguins |> 
  select(!any_of(obs))
## # A tibble: 344 × 6
##    island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex   
##    <fct>              <dbl>         <dbl>             <int>       <int> <fct> 
##  1 Torgersen           39.1          18.7               181        3750 male  
##  2 Torgersen           39.5          17.4               186        3800 female
##  3 Torgersen           40.3          18                 195        3250 female
##  4 Torgersen           NA            NA                  NA          NA <NA>  
##  5 Torgersen           36.7          19.3               193        3450 female
##  6 Torgersen           39.3          20.6               190        3650 male  
##  7 Torgersen           38.9          17.8               181        3625 female
##  8 Torgersen           39.2          19.6               195        4675 male  
##  9 Torgersen           34.1          18.1               193        3475 <NA>  
## 10 Torgersen           42            20.2               190        4250 <NA>  
## # … with 334 more rows
(参考)all_ofとany_ofの違い
# ペンギンデータに含まれていない"weight"が入ったobsを作成
obs <- 
  c("species", "year", "weight")

# all_ofを使うと"weight"がないためエラーになる
penguins |> 
  select(all_of(obs))

# any_ofを使うと"weight"がなくともエラーにならない
penguins |> 
  select(any_of(obs))

特定の文字で始まる変数を指定

選択する
# "bill"で始まる変数を選択する

# starts_with
penguins |> 
  select(starts_with("bill"))
## # A tibble: 344 × 2
##    bill_length_mm bill_depth_mm
##             <dbl>         <dbl>
##  1           39.1          18.7
##  2           39.5          17.4
##  3           40.3          18  
##  4           NA            NA  
##  5           36.7          19.3
##  6           39.3          20.6
##  7           38.9          17.8
##  8           39.2          19.6
##  9           34.1          18.1
## 10           42            20.2
## # … with 334 more rows
# matches
penguins |> 
  select(matches("^bill"))
## # A tibble: 344 × 2
##    bill_length_mm bill_depth_mm
##             <dbl>         <dbl>
##  1           39.1          18.7
##  2           39.5          17.4
##  3           40.3          18  
##  4           NA            NA  
##  5           36.7          19.3
##  6           39.3          20.6
##  7           38.9          17.8
##  8           39.2          19.6
##  9           34.1          18.1
## 10           42            20.2
## # … with 334 more rows
選択しない
# "bill"で始まる変数を選択しない

# starts_with
penguins |> 
  select(!starts_with("bill"))
## # A tibble: 344 × 6
##    species island    flipper_length_mm body_mass_g sex     year
##    <fct>   <fct>                 <int>       <int> <fct>  <int>
##  1 Adelie  Torgersen               181        3750 male    2007
##  2 Adelie  Torgersen               186        3800 female  2007
##  3 Adelie  Torgersen               195        3250 female  2007
##  4 Adelie  Torgersen                NA          NA <NA>    2007
##  5 Adelie  Torgersen               193        3450 female  2007
##  6 Adelie  Torgersen               190        3650 male    2007
##  7 Adelie  Torgersen               181        3625 female  2007
##  8 Adelie  Torgersen               195        4675 male    2007
##  9 Adelie  Torgersen               193        3475 <NA>    2007
## 10 Adelie  Torgersen               190        4250 <NA>    2007
## # … with 334 more rows
# matches
penguins |> 
  select(!matches("^bill"))
## # A tibble: 344 × 6
##    species island    flipper_length_mm body_mass_g sex     year
##    <fct>   <fct>                 <int>       <int> <fct>  <int>
##  1 Adelie  Torgersen               181        3750 male    2007
##  2 Adelie  Torgersen               186        3800 female  2007
##  3 Adelie  Torgersen               195        3250 female  2007
##  4 Adelie  Torgersen                NA          NA <NA>    2007
##  5 Adelie  Torgersen               193        3450 female  2007
##  6 Adelie  Torgersen               190        3650 male    2007
##  7 Adelie  Torgersen               181        3625 female  2007
##  8 Adelie  Torgersen               195        4675 male    2007
##  9 Adelie  Torgersen               193        3475 <NA>    2007
## 10 Adelie  Torgersen               190        4250 <NA>    2007
## # … with 334 more rows

特定の文字で終わる変数を指定

選択する
# "mm"で終わる変数を選択する

# ends_with
penguins |> 
  select(ends_with("mm"))
## # A tibble: 344 × 3
##    bill_length_mm bill_depth_mm flipper_length_mm
##             <dbl>         <dbl>             <int>
##  1           39.1          18.7               181
##  2           39.5          17.4               186
##  3           40.3          18                 195
##  4           NA            NA                  NA
##  5           36.7          19.3               193
##  6           39.3          20.6               190
##  7           38.9          17.8               181
##  8           39.2          19.6               195
##  9           34.1          18.1               193
## 10           42            20.2               190
## # … with 334 more rows
# matches
penguins |> 
  select(matches("mm$"))
## # A tibble: 344 × 3
##    bill_length_mm bill_depth_mm flipper_length_mm
##             <dbl>         <dbl>             <int>
##  1           39.1          18.7               181
##  2           39.5          17.4               186
##  3           40.3          18                 195
##  4           NA            NA                  NA
##  5           36.7          19.3               193
##  6           39.3          20.6               190
##  7           38.9          17.8               181
##  8           39.2          19.6               195
##  9           34.1          18.1               193
## 10           42            20.2               190
## # … with 334 more rows
選択しない
# "mm"で終わる変数を選択しない

# ends_with
penguins |> 
  select(!ends_with("mm"))
## # A tibble: 344 × 5
##    species island    body_mass_g sex     year
##    <fct>   <fct>           <int> <fct>  <int>
##  1 Adelie  Torgersen        3750 male    2007
##  2 Adelie  Torgersen        3800 female  2007
##  3 Adelie  Torgersen        3250 female  2007
##  4 Adelie  Torgersen          NA <NA>    2007
##  5 Adelie  Torgersen        3450 female  2007
##  6 Adelie  Torgersen        3650 male    2007
##  7 Adelie  Torgersen        3625 female  2007
##  8 Adelie  Torgersen        4675 male    2007
##  9 Adelie  Torgersen        3475 <NA>    2007
## 10 Adelie  Torgersen        4250 <NA>    2007
## # … with 334 more rows
# matches
penguins |> 
  select(!matches("mm$"))
## # A tibble: 344 × 5
##    species island    body_mass_g sex     year
##    <fct>   <fct>           <int> <fct>  <int>
##  1 Adelie  Torgersen        3750 male    2007
##  2 Adelie  Torgersen        3800 female  2007
##  3 Adelie  Torgersen        3250 female  2007
##  4 Adelie  Torgersen          NA <NA>    2007
##  5 Adelie  Torgersen        3450 female  2007
##  6 Adelie  Torgersen        3650 male    2007
##  7 Adelie  Torgersen        3625 female  2007
##  8 Adelie  Torgersen        4675 male    2007
##  9 Adelie  Torgersen        3475 <NA>    2007
## 10 Adelie  Torgersen        4250 <NA>    2007
## # … with 334 more rows

特定の文字を含む変数を指定

選択する
# "length"を含む変数を選択する

# contains
penguins |> 
  select(contains("length"))
## # A tibble: 344 × 2
##    bill_length_mm flipper_length_mm
##             <dbl>             <int>
##  1           39.1               181
##  2           39.5               186
##  3           40.3               195
##  4           NA                  NA
##  5           36.7               193
##  6           39.3               190
##  7           38.9               181
##  8           39.2               195
##  9           34.1               193
## 10           42                 190
## # … with 334 more rows
# matches
penguins |> 
  select(matches("length"))
## # A tibble: 344 × 2
##    bill_length_mm flipper_length_mm
##             <dbl>             <int>
##  1           39.1               181
##  2           39.5               186
##  3           40.3               195
##  4           NA                  NA
##  5           36.7               193
##  6           39.3               190
##  7           38.9               181
##  8           39.2               195
##  9           34.1               193
## 10           42                 190
## # … with 334 more rows
選択しない
# "length"を含む変数を選択しない

# contains
penguins |> 
  select(!contains("length"))
## # A tibble: 344 × 6
##    species island    bill_depth_mm body_mass_g sex     year
##    <fct>   <fct>             <dbl>       <int> <fct>  <int>
##  1 Adelie  Torgersen          18.7        3750 male    2007
##  2 Adelie  Torgersen          17.4        3800 female  2007
##  3 Adelie  Torgersen          18          3250 female  2007
##  4 Adelie  Torgersen          NA            NA <NA>    2007
##  5 Adelie  Torgersen          19.3        3450 female  2007
##  6 Adelie  Torgersen          20.6        3650 male    2007
##  7 Adelie  Torgersen          17.8        3625 female  2007
##  8 Adelie  Torgersen          19.6        4675 male    2007
##  9 Adelie  Torgersen          18.1        3475 <NA>    2007
## 10 Adelie  Torgersen          20.2        4250 <NA>    2007
## # … with 334 more rows
# matches
penguins |> 
  select(!matches("length"))
## # A tibble: 344 × 6
##    species island    bill_depth_mm body_mass_g sex     year
##    <fct>   <fct>             <dbl>       <int> <fct>  <int>
##  1 Adelie  Torgersen          18.7        3750 male    2007
##  2 Adelie  Torgersen          17.4        3800 female  2007
##  3 Adelie  Torgersen          18          3250 female  2007
##  4 Adelie  Torgersen          NA            NA <NA>    2007
##  5 Adelie  Torgersen          19.3        3450 female  2007
##  6 Adelie  Torgersen          20.6        3650 male    2007
##  7 Adelie  Torgersen          17.8        3625 female  2007
##  8 Adelie  Torgersen          19.6        4675 male    2007
##  9 Adelie  Torgersen          18.1        3475 <NA>    2007
## 10 Adelie  Torgersen          20.2        4250 <NA>    2007
## # … with 334 more rows

番号のついた変数を指定

選択する
# x1~x6の変数を追加したオブジェクトを作成
df <- 
  tribble(
    ~x1, ~x2, ~x3, ~x4, ~x5, ~x6,
      1,   2,   3,   4,   5,   6,
      7,   8,   9,  10,  11,  12,
     13,  14,  15,  16,  17,  18)

df
## # A tibble: 3 × 6
##      x1    x2    x3    x4    x5    x6
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     1     2     3     4     5     6
## 2     7     8     9    10    11    12
## 3    13    14    15    16    17    18
# x1~x3の変数を選択する

# num_range
df |> 
  select(num_range("x", 1:3))
## # A tibble: 3 × 3
##      x1    x2    x3
##   <dbl> <dbl> <dbl>
## 1     1     2     3
## 2     7     8     9
## 3    13    14    15
# matches
df |> 
  select(matches("x[1-3]"))
## # A tibble: 3 × 3
##      x1    x2    x3
##   <dbl> <dbl> <dbl>
## 1     1     2     3
## 2     7     8     9
## 3    13    14    15
選択しない
# x1~x6の変数を追加したオブジェクトを作成
df <- 
  tribble(
    ~x1, ~x2, ~x3, ~x4, ~x5, ~x6,
      1,   2,   3,   4,   5,   6,
      7,   8,   9,  10,  11,  12,
     13,  14,  15,  16,  17,  18)

df
## # A tibble: 3 × 6
##      x1    x2    x3    x4    x5    x6
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     1     2     3     4     5     6
## 2     7     8     9    10    11    12
## 3    13    14    15    16    17    18
# x1~x3の変数を選択しない

# num_range
df |> 
  select(!num_range("x", 1:3))
## # A tibble: 3 × 3
##      x4    x5    x6
##   <dbl> <dbl> <dbl>
## 1     4     5     6
## 2    10    11    12
## 3    16    17    18
# matches
df |> 
  select(!matches("x[1-3]"))
## # A tibble: 3 × 3
##      x4    x5    x6
##   <dbl> <dbl> <dbl>
## 1     4     5     6
## 2    10    11    12
## 3    16    17    18

変数名を変えて選択する

  • rename()と同じように変数名を変えられる
# "bill_length_mm"を"kuchibashi_length_mm"に変更する
# "bill_length_mm"を"kuchibashi_length_mm"に変更する
# names()で変数名を確認
penguins |> 
  select(kuchibashi_length_mm = bill_length_mm,
         kuchibashi_depth_mm = bill_depth_mm) |> 
  names()
## [1] "kuchibashi_length_mm" "kuchibashi_depth_mm"

変数名を変える(rename)

変数名をひとつずつ変える

  • rename(新しい変数名 = 古い変数名)
# "bill_length_mm"を"kuchibashi_length_mm"に変更する
# "bill_length_mm"を"kuchibashi_length_mm"に変更する
# names()で変数名を確認
penguins |> 
  rename(kuchibashi_length_mm = bill_length_mm,
         kuchibashi_depth_mm = bill_depth_mm) |> 
  names()
## [1] "species"              "island"               "kuchibashi_length_mm"
## [4] "kuchibashi_depth_mm"  "flipper_length_mm"    "body_mass_g"         
## [7] "sex"                  "year"

条件を指定して変数名を一気に変える

# "bill"から始まる変数のとき,"bill"を"kuchibashi"に変更する
# names()で変数名を確認
penguins |> 
  rename_with(~str_replace(., "bill", "kuchibashi"),
              starts_with("bill")) |> 
  names()
## [1] "species"              "island"               "kuchibashi_length_mm"
## [4] "kuchibashi_depth_mm"  "flipper_length_mm"    "body_mass_g"         
## [7] "sex"                  "year"
# "_mm"で終わる変数のとき,"_mm"を削除する
# names()で変数名を確認
penguins |> 
  rename_with(~str_replace(., "_mm", ""),
              ends_with("_mm")) |> 
  names()
## [1] "species"        "island"         "bill_length"    "bill_depth"    
## [5] "flipper_length" "body_mass_g"    "sex"            "year"

変数名に共通の語を一気につける

# "sex"が"male"のとき,"bill","flipper","body"を含む変数に接頭辞"male_"をつける
# names()で変数名を確認
penguins |> 
  filter(sex == "male") |> 
  rename_with(~str_c("male_", .),
              matches("bill|flipper|body")) |> 
  names()
## [1] "species"                "island"                 "male_bill_length_mm"   
## [4] "male_bill_depth_mm"     "male_flipper_length_mm" "male_body_mass_g"      
## [7] "sex"                    "year"
# "sex"が"male"のとき,"bill","flipper","body"を含む変数に接尾辞"_male"をつける
# names()で変数名を確認
penguins |> 
  filter(sex == "male") |> 
  rename_with(~str_c(., "_male"),
              matches("bill|flipper|body")) |> 
  names()
## [1] "species"                "island"                 "bill_length_mm_male"   
## [4] "bill_depth_mm_male"     "flipper_length_mm_male" "body_mass_g_male"      
## [7] "sex"                    "year"

変数を追加する(mutate)

変数をひとつ追加する

  • デフォルトではデータセットの右側に新しく変数が追加される
# "body_mass_kg"を新たに追加する
# "body_mass_kg"は"body_mass_g"を1000で割ったもの
# "body_mass_kg"は一番右側に作られる
# select()で"body_mass_g"と"body_mass_kg"を確認
penguins |> 
  mutate(body_mass_kg = body_mass_g / 1000) |> 
  select(body_mass_g, body_mass_kg)
## # A tibble: 344 × 2
##    body_mass_g body_mass_kg
##          <int>        <dbl>
##  1        3750         3.75
##  2        3800         3.8 
##  3        3250         3.25
##  4          NA        NA   
##  5        3450         3.45
##  6        3650         3.65
##  7        3625         3.62
##  8        4675         4.68
##  9        3475         3.48
## 10        4250         4.25
## # … with 334 more rows
任意の変数の前に追加する
  • 任意の変数の前に入れたい場合は.beforeが使える
# ".before = 1"とすると一番目の変数の前に加わる
penguins |> 
  mutate(body_mass_kg = body_mass_g / 1000,
         .before = 1) 
## # A tibble: 344 × 9
##    body_mass_kg species island    bill_length_mm bill_depth_mm flipper_length_mm
##           <dbl> <fct>   <fct>              <dbl>         <dbl>             <int>
##  1         3.75 Adelie  Torgersen           39.1          18.7               181
##  2         3.8  Adelie  Torgersen           39.5          17.4               186
##  3         3.25 Adelie  Torgersen           40.3          18                 195
##  4        NA    Adelie  Torgersen           NA            NA                  NA
##  5         3.45 Adelie  Torgersen           36.7          19.3               193
##  6         3.65 Adelie  Torgersen           39.3          20.6               190
##  7         3.62 Adelie  Torgersen           38.9          17.8               181
##  8         4.68 Adelie  Torgersen           39.2          19.6               195
##  9         3.48 Adelie  Torgersen           34.1          18.1               193
## 10         4.25 Adelie  Torgersen           42            20.2               190
## # … with 334 more rows, and 3 more variables: body_mass_g <int>, sex <fct>,
## #   year <int>
# ".before = body_mass_g"とすると"body_mass_g"の前に加わる
penguins |> 
  mutate(body_mass_kg = body_mass_g / 1000,
         .before = body_mass_g) 
## # A tibble: 344 × 9
##    species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_kg
##    <fct>   <fct>              <dbl>         <dbl>             <int>        <dbl>
##  1 Adelie  Torgersen           39.1          18.7               181         3.75
##  2 Adelie  Torgersen           39.5          17.4               186         3.8 
##  3 Adelie  Torgersen           40.3          18                 195         3.25
##  4 Adelie  Torgersen           NA            NA                  NA        NA   
##  5 Adelie  Torgersen           36.7          19.3               193         3.45
##  6 Adelie  Torgersen           39.3          20.6               190         3.65
##  7 Adelie  Torgersen           38.9          17.8               181         3.62
##  8 Adelie  Torgersen           39.2          19.6               195         4.68
##  9 Adelie  Torgersen           34.1          18.1               193         3.48
## 10 Adelie  Torgersen           42            20.2               190         4.25
## # … with 334 more rows, and 3 more variables: body_mass_g <int>, sex <fct>,
## #   year <int>
任意の変数の後に追加する
  • 任意の変数の後に入れたい場合は.afterが使える
# ".after = 1"とすると一番目の変数の後に加わる
penguins |> 
  mutate(body_mass_kg = body_mass_g / 1000,
         .after = 1) 
## # A tibble: 344 × 9
##    species body_mass_kg island    bill_length_mm bill_depth_mm flipper_length_mm
##    <fct>          <dbl> <fct>              <dbl>         <dbl>             <int>
##  1 Adelie          3.75 Torgersen           39.1          18.7               181
##  2 Adelie          3.8  Torgersen           39.5          17.4               186
##  3 Adelie          3.25 Torgersen           40.3          18                 195
##  4 Adelie         NA    Torgersen           NA            NA                  NA
##  5 Adelie          3.45 Torgersen           36.7          19.3               193
##  6 Adelie          3.65 Torgersen           39.3          20.6               190
##  7 Adelie          3.62 Torgersen           38.9          17.8               181
##  8 Adelie          4.68 Torgersen           39.2          19.6               195
##  9 Adelie          3.48 Torgersen           34.1          18.1               193
## 10 Adelie          4.25 Torgersen           42            20.2               190
## # … with 334 more rows, and 3 more variables: body_mass_g <int>, sex <fct>,
## #   year <int>
# ".after = body_mass_g"とすると"body_mass_g"の後に加わる
penguins |> 
  mutate(body_mass_kg = body_mass_g / 1000,
         .after = body_mass_g) 
## # A tibble: 344 × 9
##    species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##    <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
##  1 Adelie  Torgersen           39.1          18.7               181        3750
##  2 Adelie  Torgersen           39.5          17.4               186        3800
##  3 Adelie  Torgersen           40.3          18                 195        3250
##  4 Adelie  Torgersen           NA            NA                  NA          NA
##  5 Adelie  Torgersen           36.7          19.3               193        3450
##  6 Adelie  Torgersen           39.3          20.6               190        3650
##  7 Adelie  Torgersen           38.9          17.8               181        3625
##  8 Adelie  Torgersen           39.2          19.6               195        4675
##  9 Adelie  Torgersen           34.1          18.1               193        3475
## 10 Adelie  Torgersen           42            20.2               190        4250
## # … with 334 more rows, and 3 more variables: body_mass_kg <dbl>, sex <fct>,
## #   year <int>
保持する変数を制限する
  • 保持する変数を制限する場合はkeepが使える
# ".keep = "used""とすると使った変数のみが表示される
penguins |> 
  mutate(body_mass_kg = body_mass_g / 1000,
         .keep = "used") 
## # A tibble: 344 × 2
##    body_mass_g body_mass_kg
##          <int>        <dbl>
##  1        3750         3.75
##  2        3800         3.8 
##  3        3250         3.25
##  4          NA        NA   
##  5        3450         3.45
##  6        3650         3.65
##  7        3625         3.62
##  8        4675         4.68
##  9        3475         3.48
## 10        4250         4.25
## # … with 334 more rows

変数を複数追加する

# "bill_length_mm_cm","flipper_length_mm_cm"を新たに追加する
# "bill_length_mm_cm"は"bill_length_mm"を10で割ったもの(flipper_lengthも同じ)
# select()で"bill_length_mm"と"bill_length_mm_cm","flipper_length_mm"と"flipper_length_mm_cm"を確認

# c()
penguins |> 
  mutate(across(c(bill_length_mm, flipper_length_mm),
         list(cm = ~ (. / 10)))) |> 
  select(bill_length_mm, bill_length_mm_cm, flipper_length_mm, flipper_length_mm_cm)
## # A tibble: 344 × 4
##    bill_length_mm bill_length_mm_cm flipper_length_mm flipper_length_mm_cm
##             <dbl>             <dbl>             <int>                <dbl>
##  1           39.1              3.91               181                 18.1
##  2           39.5              3.95               186                 18.6
##  3           40.3              4.03               195                 19.5
##  4           NA               NA                   NA                 NA  
##  5           36.7              3.67               193                 19.3
##  6           39.3              3.93               190                 19  
##  7           38.9              3.89               181                 18.1
##  8           39.2              3.92               195                 19.5
##  9           34.1              3.41               193                 19.3
## 10           42                4.2                190                 19  
## # … with 334 more rows
# ends_with
penguins |> 
  mutate(across(ends_with("length_mm"),
         list(cm = ~ (. / 10)))) |> 
  select(bill_length_mm, bill_length_mm_cm, flipper_length_mm, flipper_length_mm_cm)
## # A tibble: 344 × 4
##    bill_length_mm bill_length_mm_cm flipper_length_mm flipper_length_mm_cm
##             <dbl>             <dbl>             <int>                <dbl>
##  1           39.1              3.91               181                 18.1
##  2           39.5              3.95               186                 18.6
##  3           40.3              4.03               195                 19.5
##  4           NA               NA                   NA                 NA  
##  5           36.7              3.67               193                 19.3
##  6           39.3              3.93               190                 19  
##  7           38.9              3.89               181                 18.1
##  8           39.2              3.92               195                 19.5
##  9           34.1              3.41               193                 19.3
## 10           42                4.2                190                 19  
## # … with 334 more rows

2値変数をひとつ追加する

# "body_mass_3000"を新たに追加する
# "body_mass_3000"は"body_mass_g"が"3000以上"の場合は"1",そうでない場合は"0"のもの
# count()で"body_mass_g"と"body_mass_3000"を確認
penguins |> 
  mutate(body_mass_3000 = if_else(body_mass_g >= 3000, 1, 0)) |> 
  count(body_mass_g, body_mass_3000)
## # A tibble: 95 × 3
##    body_mass_g body_mass_3000     n
##          <int>          <dbl> <int>
##  1        2700              0     1
##  2        2850              0     2
##  3        2900              0     4
##  4        2925              0     1
##  5        2975              0     1
##  6        3000              1     2
##  7        3050              1     4
##  8        3075              1     1
##  9        3100              1     1
## 10        3150              1     4
## # … with 85 more rows

3値以上の変数をひとつ追加する

# "body_mass_3000"を新たに追加する
# "body_mass_3000"は"body_mass_g"が"3000以上"の場合は"1",そうでない場合は"0"のもの
# count()で"body_mass_g"と"body_mass_3000"を確認
# "body_mass_g"がNAのものは"不明"とする
penguins |> 
  mutate(
    body_mass_range = case_when(
      body_mass_g <= 3000 ~ "~3000", 
      body_mass_g <= 4000 ~ "~4000",
      body_mass_g <= 5000 ~ "~5000",
      body_mass_g <= 6000 ~ "~6000",
      body_mass_g >= 6000 ~ "6000~",
      is.na(body_mass_g)  ~ "不明")) |> 
  count(body_mass_g, body_mass_range)
## # A tibble: 95 × 3
##    body_mass_g body_mass_range     n
##          <int> <chr>           <int>
##  1        2700 ~3000              1
##  2        2850 ~3000              2
##  3        2900 ~3000              4
##  4        2925 ~3000              1
##  5        2975 ~3000              1
##  6        3000 ~3000              2
##  7        3050 ~4000              4
##  8        3075 ~4000              1
##  9        3100 ~4000              1
## 10        3150 ~4000              4
## # … with 85 more rows

変数の型を変更する ★要確認

  • 変数の型
関数 用途
as.character 文字列型に変更する
as.factor 因子型に変更する
as.numeric 数値型に変更する
# "year"を文字列型に変更する
# count()で"year"の型を確認
penguins |> 
  mutate(
    year = as.character(year)
    ) |> 
  count(year)
## # A tibble: 3 × 2
##   year      n
##   <chr> <int>
## 1 2007    110
## 2 2008    114
## 3 2009    120
# "year"を因子型に変更する
# count()で"year"の型を確認
penguins |> 
  mutate(
    year = as.factor(year)
    ) |> 
  count(year)
## # A tibble: 3 × 2
##   year      n
##   <fct> <int>
## 1 2007    110
## 2 2008    114
## 3 2009    120
# "year"を数値型に変更する
# count()で"year"の型を確認
penguins |> 
  mutate(
    year = as.numeric(year)
    ) |> 
  count(year)
## # A tibble: 3 × 2
##    year     n
##   <dbl> <int>
## 1  2007   110
## 2  2008   114
## 3  2009   120

ひとつの変数内で水準名を変更する

# "sex"の"male"を"1"に,"female"を"2"に変更する
# count()で"sex"を確認
penguins |> 
  mutate(
    sex = fct_recode(sex, "1" = "male", 
                          "2" = "female")) |> 
  count(sex)
## # A tibble: 3 × 2
##   sex       n
##   <fct> <int>
## 1 2       165
## 2 1       168
## 3 <NA>     11

他の変数を使って水準名を変更する

# "fruit"と"color"の変数を追加したオブジェクトを作成
df <- 
  tribble(
     ~fruit,     ~color, 
     "apple",      "red", 
    "banana",   "yellow",  
     "melon",     "blue"
    )

df 
## # A tibble: 3 × 2
##   fruit  color 
##   <chr>  <chr> 
## 1 apple  red   
## 2 banana yellow
## 3 melon  blue
# "fruit"の"melon"の"color"を"green"に変更,それ以外の"color"はそのままとする
df |> 
  mutate(color = case_when(
    fruit == "melon" ~ "green",
    TRUE ~ color))
## # A tibble: 3 × 2
##   fruit  color 
##   <chr>  <chr> 
## 1 apple  red   
## 2 banana yellow
## 3 melon  green

水準を並び替える

# "fruit"と"color"の変数を追加したオブジェクトを作成
df <- 
  tribble(
     ~fruit,     ~color, 
     "apple",      "red", 
    "banana",   "yellow",  
     "melon",     "blue"
    )

df
## # A tibble: 3 × 2
##   fruit  color 
##   <chr>  <chr> 
## 1 apple  red   
## 2 banana yellow
## 3 melon  blue
# "fruit"を"melon","banana","apple"の順に並び替える
df |> 
  mutate(fruit = fct_relevel(fruit,
                             "melon",
                             "banana",
                             "apple")) |> 
  arrange(fruit)
## # A tibble: 3 × 2
##   fruit  color 
##   <fct>  <chr> 
## 1 melon  blue  
## 2 banana yellow
## 3 apple  red

逆転処理する

# x1~x3,y1~y3の変数を追加したオブジェクトを作成
df <- 
  tribble(
    ~x1, ~x2, ~x3, ~y1, ~y2, ~y3,
      1,   2,   3,   4,   1,   2,
      3,   4,   1,   2,   3,   4,
      1,   2,   3,   4,   1,   2)

# x1~x3を逆転処理する(4件法の場合)
# count()で"x1"と逆転処理した"x1_r"を確認
df |> 
  mutate(
    across(x1:x3,
           list(r = ~(5 -.))
           )
  ) |> 
  count(x1, x1_r)
## # A tibble: 2 × 3
##      x1  x1_r     n
##   <dbl> <dbl> <int>
## 1     1     4     2
## 2     3     2     1

小数点以下の処理

小数第二位を切り捨てる
# x1~x2の変数を追加したオブジェクトを作成
df <- 
  tribble(
      ~x1,   ~x2,
    0.123, 0.901,
    0.234, 0.890,
    0.345, 0.789,
    0.456, 0.678,
    0.567, 0.567,
    0.678, 0.456,
    0.789, 0.345,
    0.890, 0.234,
    0.901, 0.123)

# ひとつの変数で小数第二位を切り捨てる
df |> 
  mutate(x1_kirisute = trunc(x1 * 100) / 100)
## # A tibble: 9 × 3
##      x1    x2 x1_kirisute
##   <dbl> <dbl>       <dbl>
## 1 0.123 0.901        0.12
## 2 0.234 0.89         0.23
## 3 0.345 0.789        0.34
## 4 0.456 0.678        0.45
## 5 0.567 0.567        0.56
## 6 0.678 0.456        0.67
## 7 0.789 0.345        0.78
## 8 0.89  0.234        0.89
## 9 0.901 0.123        0.9
# 複数の変数で小数第二位を切り捨てる
df |> 
  mutate(across(starts_with("x"),
         list(kirisute = ~trunc(. * 100) / 100)))
## # A tibble: 9 × 4
##      x1    x2 x1_kirisute x2_kirisute
##   <dbl> <dbl>       <dbl>       <dbl>
## 1 0.123 0.901        0.12        0.9 
## 2 0.234 0.89         0.23        0.89
## 3 0.345 0.789        0.34        0.78
## 4 0.456 0.678        0.45        0.67
## 5 0.567 0.567        0.56        0.56
## 6 0.678 0.456        0.67        0.45
## 7 0.789 0.345        0.78        0.34
## 8 0.89  0.234        0.89        0.23
## 9 0.901 0.123        0.9         0.12
小数第二位を四捨五入する{-} ★これから
  • round()は四捨五入ではないため使用しない

変数を要約する(summarize)

  • 平均値,標準偏差,人数などを算出する

  • 平均値,標準偏差などはna.rm = TRUEを入れないと欠損がある場合NAになってしまう

  • 人数は!is.na()を入れることで欠損を抜いて合計する

ひとつの要約値をひとつの変数で算出する

# 平均値(mean)
penguins |> 
  summarize(bill_length_mm_mean = mean(bill_length_mm, na.rm = TRUE))
## # A tibble: 1 × 1
##   bill_length_mm_mean
##                 <dbl>
## 1                43.9
# 標準偏差(sd)
penguins |> 
  summarize(bill_length_mm_sd = sd(bill_length_mm, na.rm = TRUE))
## # A tibble: 1 × 1
##   bill_length_mm_sd
##               <dbl>
## 1              5.46
# 人数(sum)
penguins |> 
  summarize(bill_length_mm_n = sum(!is.na(bill_length_mm)))
## # A tibble: 1 × 1
##   bill_length_mm_n
##              <int>
## 1              342

複数の要約値を複数の変数で算出する

# "bill_length_mm"と"bill_depth_mm"の平均値,標準偏差,人数
penguins |> 
  summarize(across(c(bill_length_mm, bill_depth_mm),
                   list(mean = ~mean(., na.rm = TRUE),
                        sd   = ~sd(., na.rm = TRUE),
                        n    = ~sum(!is.na(.)))))
## # A tibble: 1 × 6
##   bill_length_mm_mean bill_length_mm_sd bill_length_mm_n bill_depth_mm_mean
##                 <dbl>             <dbl>            <int>              <dbl>
## 1                43.9              5.46              342               17.2
## # … with 2 more variables: bill_depth_mm_sd <dbl>, bill_depth_mm_n <int>

層別に算出する

  • 層別に(グループ化して)扱いたいときはgroup_by()を使う

  • 層別(グループ化)を解除したいときはungroup()を使う

# "species"ごとに"bill_length_mm"と"bill_depth_mm"の平均値,標準偏差,人数
penguins |> 
  group_by(species) |> 
  summarize(across(c(bill_length_mm, bill_depth_mm),
                   list(mean = ~mean(., na.rm = TRUE),
                        sd   = ~sd(., na.rm = TRUE),
                        n    = ~sum(!is.na(.)))))
## # A tibble: 3 × 7
##   species   bill_length_mm_m… bill_length_mm_… bill_length_mm_n bill_depth_mm_m…
##   <fct>                 <dbl>            <dbl>            <int>            <dbl>
## 1 Adelie                 38.8             2.66              151             18.3
## 2 Chinstrap              48.8             3.34               68             18.4
## 3 Gentoo                 47.5             3.08              123             15.0
## # … with 2 more variables: bill_depth_mm_sd <dbl>, bill_depth_mm_n <int>

データセットを縦に長くする(pivot_longer)

基本形

  • colsにはピボットする必要がある変数を入れる

  • select()と同じでヘルパー関数も使用可能

  • names_toにはcolsで選んだ変数名を格納する変数名をつける

  • もとの変数名は新しい変数の値になる

  • values_toにはcolsで選んだセルを格納する変数名をつける

Figure20.pivot_longerの説明1(Wickham & Grolemund, Figure6.4)

# var,col1,col2の変数を追加したオブジェクトを作成
df <- tribble(
  ~var, ~col1, ~col2,
   "A",     1,     2,
   "B",     3,     4,
   "C",     5,     6
)

df
## # A tibble: 3 × 3
##   var    col1  col2
##   <chr> <dbl> <dbl>
## 1 A         1     2
## 2 B         3     4
## 3 C         5     6
# col1とcol2をピボットしたいので,cols = col1:col2とする
# 選んだ変数名を"names"という名前の変数に格納したいので,names_to = "names"とする
# 選んだ変数の値を"value"という名前の変数に格納したいので,values_to = "value"とする
df |> 
  pivot_longer(
    cols = col1:col2, 
    names_to = "names", 
    values_to = "value"
  )
## # A tibble: 6 × 3
##   var   names value
##   <chr> <chr> <dbl>
## 1 A     col1      1
## 2 A     col2      2
## 3 B     col1      3
## 4 B     col2      4
## 5 C     col1      5
## 6 C     col2      6

変数名を分割する

ひとつの変数にまとめる
  • names_toにはcolsで選んだ変数名を格納する変数名をつける

  • もとの変数名は新しい変数の値になる

  • 複数の変数名を指定できる

  • names_sepには変数名を分割する区切りを入れる

Figure21.pivot_longerの説明2(Wickham & Grolemund, Figure6.6)

# var,x_1,y_2の変数を追加したオブジェクトを作成
df <- tribble(
  ~var, ~x_1, ~y_2,
   "A",    1,    2,
   "B",    3,    4,
   "C",    5,    6
)

df
## # A tibble: 3 × 3
##   var     x_1   y_2
##   <chr> <dbl> <dbl>
## 1 A         1     2
## 2 B         3     4
## 3 C         5     6
# var以外の変数をピボットしたいので,cols = !varとする
# 選んだ変数名を"name","number"という名前の変数に格納したいので,names_to = c("name", "number")とする
# 選んだ変数の値を"value"という名前の変数に格納したいので,values_to = "value"とする
df |> 
  pivot_longer(
    cols = !var, 
    names_to = c("name", "number"), 
    names_sep = "_",
    values_to = "value"
  )
## # A tibble: 6 × 4
##   var   name  number value
##   <chr> <chr> <chr>  <dbl>
## 1 A     x     1          1
## 2 A     y     2          2
## 3 B     x     1          3
## 4 B     y     2          4
## 5 C     x     1          5
## 6 C     y     2          6
もとの変数名から変数を作る
  • names_toにはcolsで選んだ変数名を格納する変数名をつける

  • もとの変数名は新しい変数の値になる

  • 複数の変数名を指定できる

  • もとの変数名の最初のまとまりを新しい変数名として使う場合に".value"を使う

  • names_sepには変数名を分割する区切りを入れる

Figure22.pivot_longerの説明3(Wickham & Grolemund, Figure6.7)

# var,x_1,x_2,y_1,y_2の変数を追加したオブジェクトを作成
df <- tribble(
  ~var, ~x_1, ~x_2, ~y_1, ~y_2,
   "A",    1,    2,    3,    4,
   "B",    5,    6,    7,    8
)

df
## # A tibble: 2 × 5
##   var     x_1   x_2   y_1   y_2
##   <chr> <dbl> <dbl> <dbl> <dbl>
## 1 A         1     2     3     4
## 2 B         5     6     7     8
# var以外の変数をピボットしたいので,cols = !varとする
# 選んだ変数名のうち"x_1"か"x_2"ならば"x","y_1"か"y_2"ならば"y"という名前の変数に格納したいので,names_toに".value"を入れる
# 加えて"x_1"か"y_1"ならば"1","x_2"か"y_2"ならば"2"を"id"という名前の変数に格納したいので,names_toに"id"も入れる
# 選んだ変数の値を"value"という名前の変数に格納したいので,values_to = "value"とする
df |> 
  pivot_longer(
    cols = !var, 
    names_to = c(".value", "id"), 
    names_sep = "_"
    ) |> 
  select(var, x:y, id)
## # A tibble: 4 × 4
##   var       x     y id   
##   <chr> <dbl> <dbl> <chr>
## 1 A         1     3 1    
## 2 A         2     4 2    
## 3 B         5     7 1    
## 4 B         6     8 2

変数名をもっと自由に分割する ★作成中

  • names_patternで変数名を自由に分割できる
# var,x_1,x_2,y_1,y_2の変数を追加したオブジェクトを作成
df <- tribble(
  ~var, ~x_1, ~x_2, ~y_1, ~y_2,
   "A",    1,    2,    3,    4,
   "B",    5,    6,    7,    8
)

df
## # A tibble: 2 × 5
##   var     x_1   x_2   y_1   y_2
##   <chr> <dbl> <dbl> <dbl> <dbl>
## 1 A         1     2     3     4
## 2 B         5     6     7     8
df |> 
  pivot_longer(
    cols = !var, 
    names_prefix = "x_|y_"
    ) 
## # A tibble: 8 × 3
##   var   name  value
##   <chr> <chr> <dbl>
## 1 A     1         1
## 2 A     2         2
## 3 A     1         3
## 4 A     2         4
## 5 B     1         5
## 6 B     2         6
## 7 B     1         7
## 8 B     2         8

各変数名の先頭から指定の文字を削除

  • names_prefixで指定の文字を削除できる
# var,x_1,x_2,y_1,y_2の変数を追加したオブジェクトを作成
df <- tribble(
  ~var, ~x_1, ~x_2, ~y_1, ~y_2,
   "A",    1,    2,    3,    4,
   "B",    5,    6,    7,    8
)

df
## # A tibble: 2 × 5
##   var     x_1   x_2   y_1   y_2
##   <chr> <dbl> <dbl> <dbl> <dbl>
## 1 A         1     2     3     4
## 2 B         5     6     7     8
df |> 
  pivot_longer(
    cols = !var, 
    names_prefix = "x_|y_"
    ) 
## # A tibble: 8 × 3
##   var   name  value
##   <chr> <chr> <dbl>
## 1 A     1         1
## 2 A     2         2
## 3 A     1         3
## 4 A     2         4
## 5 B     1         5
## 6 B     2         6
## 7 B     1         7
## 8 B     2         8

欠損ケースを除外する

# var,x_1,x_2,y_1,y_2の変数を追加したオブジェクトを作成
# varが"C"のケースは,すべての変数が欠損している
df <- tribble(
  ~var, ~x_1, ~x_2, ~y_1, ~y_2,
   "A",    1,    2,    3,    4,
   "B",    5,    6,    7,    8,
   "C",   NA,   NA,   NA,   NA
)

df
## # A tibble: 3 × 5
##   var     x_1   x_2   y_1   y_2
##   <chr> <dbl> <dbl> <dbl> <dbl>
## 1 A         1     2     3     4
## 2 B         5     6     7     8
## 3 C        NA    NA    NA    NA
# values_drop_naを入れない場合
df |> 
  pivot_longer(
    cols = !var, 
    names_to = c(".value", "id"), 
    names_sep = "_")
## # A tibble: 6 × 4
##   var   id        x     y
##   <chr> <chr> <dbl> <dbl>
## 1 A     1         1     3
## 2 A     2         2     4
## 3 B     1         5     7
## 4 B     2         6     8
## 5 C     1        NA    NA
## 6 C     2        NA    NA
# values_drop_naを入れた場合
df |> 
  pivot_longer(
    cols = !var, 
    names_to = c(".value", "id"), 
    names_sep = "_",
    values_drop_na = TRUE)
## # A tibble: 4 × 4
##   var   id        x     y
##   <chr> <chr> <dbl> <dbl>
## 1 A     1         1     3
## 2 A     2         2     4
## 3 B     1         5     7
## 4 B     2         6     8

データセットを横に広くする(pivot_wider)

ショートカット

引用文献